///**
// * Copyright 1996-2014 FoxBPM ORG.
// *
// * Licensed under the Apache License, Version 2.0 (the "License");
// * you may not use this file except in compliance with the License.
// * You may obtain a copy of the License at
// * 
// *      http://www.apache.org/licenses/LICENSE-2.0
// * 
// * Unless required by applicable law or agreed to in writing, software
// * distributed under the License is distributed on an "AS IS" BASIS,
// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// * See the License for the specific language governing permissions and
// * limitations under the License.
// * 
// * @author kenshin
// */
//package org.foxbpm.engine.impl.util;
//
//import java.util.ArrayList;
//import java.util.List;
//
//import org.eclipse.bpmn2.BaseElement;
//import org.eclipse.bpmn2.Bpmn2Factory;
//import org.eclipse.bpmn2.Definitions;
//import org.eclipse.bpmn2.Documentation;
//import org.eclipse.bpmn2.Expression;
//import org.eclipse.bpmn2.ExtensionAttributeValue;
//import org.eclipse.bpmn2.FormalExpression;
//import org.eclipse.bpmn2.ParallelGateway;
//import org.eclipse.bpmn2.Process;
//import org.eclipse.bpmn2.ResourceRole;
//import org.eclipse.bpmn2.SequenceFlow;
//import org.eclipse.bpmn2.UserTask;
//import org.eclipse.bpmn2.di.BPMNEdge;
//import org.eclipse.bpmn2.di.BPMNShape;
//import org.eclipse.dd.di.DiagramElement;
//import org.eclipse.emf.common.util.TreeIterator;
//import org.eclipse.emf.ecore.EAttribute;
//import org.eclipse.emf.ecore.EObject;
//import org.eclipse.emf.ecore.EReference;
//import org.eclipse.emf.ecore.impl.BasicEObjectImpl;
//import org.eclipse.emf.ecore.impl.EStructuralFeatureImpl.SimpleFeatureMapEntry;
//import org.eclipse.emf.ecore.util.FeatureMap;
//import org.foxbpm.engine.impl.connector.ConnectorListener;
//import org.foxbpm.engine.impl.task.TaskAssigneeDefinition;
//import org.foxbpm.engine.task.TaskCommand;
//import org.foxbpm.model.SkipStrategy;
//import org.foxbpm.model.bpmn.foxbpm.AssignPolicyType;
//import org.foxbpm.model.bpmn.foxbpm.CompleteTaskDescription;
//import org.foxbpm.model.bpmn.foxbpm.ExpectedExecutionTime;
//import org.foxbpm.model.bpmn.foxbpm.FormParamContainer;
//import org.foxbpm.model.bpmn.foxbpm.FormUri;
//import org.foxbpm.model.bpmn.foxbpm.FormUriView;
//import org.foxbpm.model.bpmn.foxbpm.FoxBPMPackage;
//import org.foxbpm.model.bpmn.foxbpm.PotentialStarter;
//import org.foxbpm.model.bpmn.foxbpm.TaskDescription;
//import org.foxbpm.model.bpmn.foxbpm.TaskPriority;
//import org.foxbpm.model.bpmn.foxbpm.TaskSubject;
//
//
//public class BpmnModelUtil {
//	
//	/** 获取流程的唯一编号*/
//	public static String getProcessId(Process process){
//		return StringUtil.getString(getExtensionAttribute(process,FoxBPMPackage.Literals.DOCUMENT_ROOT__DBID));
//	}
//	
//	/** 获取任务领取方式*/
//	public static String claimType(UserTask userTask){
//		return StringUtil.getString(getExtensionAttribute(userTask,FoxBPMPackage.Literals.DOCUMENT_ROOT__CLAIM_TYPE));
//	}
//	
//	/** 获取并行网关合并策略*/
//	public static String convergType(ParallelGateway parallelGateway){
//		return StringUtil.getString(getExtensionAttribute(parallelGateway,FoxBPMPackage.Literals.DOCUMENT_ROOT__CONVERG_TYPE));
//	}
//	
//	/** 获取流程的分类*/
//	public static String getProcessCategory(Process process){
//		return StringUtil.getString(getExtensionAttribute(process,FoxBPMPackage.Literals.DOCUMENT_ROOT__CATEGORY));
//	}
//	
//	/** 获取流程的发起人*/
//	public static List<PotentialStarter> getPotentialStarters(Process process){
//		
//		List<PotentialStarter> extensionElementList = getExtensionElementList(PotentialStarter.class, process, FoxBPMPackage.Literals.DOCUMENT_ROOT__POTENTIAL_STARTER);
//		
//		return extensionElementList;
//	}
//	
//	public List<ConnectorListener> getcConnectors(BaseElement baseElement){
//		
//		List<ConnectorListener> connectors=new ArrayList<ConnectorListener>();
//		
//		
//		return connectors;
//	}
//	
//	/**
//	 * 获取开始节点是否持久化属性
//	 * @param baseElement
//	 * @return
//	 */
//	public static boolean getStartEventPersistence(BaseElement baseElement){
//		return StringUtil.getBoolean(BpmnModelUtil.getExtensionAttribute(baseElement, FoxBPMPackage.Literals.DOCUMENT_ROOT__IS_PERSISTENCE));
//	}
//	
//	/**
//	 * 获取线条表达式值
//	 * @param baseElement
//	 * @return
//	 */
//	public static String getSequenceFlowCondition(BaseElement baseElement){
//		SequenceFlow sequenceFlow = (SequenceFlow)baseElement;
//		Expression expression = sequenceFlow.getConditionExpression();
//		if(expression != null){
//			FormalExpression formalExpression = (FormalExpression)expression;
//			return formalExpression.getBody();
//		}
//		return null;
//	}
//	
//	/**
//	 * 获取人工任务主题信息
//	 * @param baseElement
//	 * @return
//	 */
//	public static String getUserTaskSubject(BaseElement baseElement){
//		TaskSubject taskSubject = (TaskSubject)BpmnModelUtil.getExtensionElement(baseElement,FoxBPMPackage.Literals.DOCUMENT_ROOT__TASK_SUBJECT);
//		if(taskSubject != null&&taskSubject.getExpression()!=null){
//			
//			
//			
//			return taskSubject.getExpression().getValue();
//			
//		}
//		return null;
//	}
//	
//	
//	/**
//	 * 获取人工任务表单参数
//	 * @param baseElement
//	 * @return
//	 */
//	public static FormParamContainer getFormParamContainer(BaseElement baseElement){
//		FormParamContainer formParamContainer = (FormParamContainer)BpmnModelUtil.getExtensionElement(baseElement,FoxBPMPackage.Literals.DOCUMENT_ROOT__FORM_PARAM_CONTAINER);
//		return formParamContainer;
//	}
//	
//	
//	
//	
//	/**
//	 * 获取人工任务描述
//	 * @param baseElement
//	 * @return
//	 */
//	public static String getUserTaskDescription(BaseElement baseElement){
//		TaskDescription taskDescription = (TaskDescription)BpmnModelUtil.getExtensionElement(baseElement,FoxBPMPackage.Literals.DOCUMENT_ROOT__TASK_DESCRIPTION);
//		if(taskDescription != null&&taskDescription.getExpression()!=null){
//			return taskDescription.getExpression().getValue();
//		}
//		return null;
//	}
//	
//	/**
//	 * 获取人工任务描述
//	 * @param baseElement
//	 * @return
//	 */
//	public static double getExpectedExecuteTime(BaseElement baseElement){
//		ExpectedExecutionTime time = (ExpectedExecutionTime)BpmnModelUtil.getExtensionElement(baseElement,FoxBPMPackage.Literals.DOCUMENT_ROOT__EXPECTED_EXECUTION_TIME);
//		if(time != null){
//			int day = time.getDay();
//			int hours = time.getHour();
//			int minute = time.getMinute();
//			double expectTime = day*24 + hours + ((double)minute)/60;
//			return expectTime;
//		}
//		return 0;
//	}
//	
//	/**
//	 * 获取人工任务完成后的描述
//	 * @param baseElement
//	 * @return
//	 */
//	public static String getUserTaskCompleteTaskDescription(BaseElement baseElement){
//		CompleteTaskDescription completeTaskDescription = (CompleteTaskDescription)BpmnModelUtil.getExtensionElement(baseElement,FoxBPMPackage.Literals.DOCUMENT_ROOT__COMPLETE_TASK_DESCRIPTION);
//		if(completeTaskDescription != null&&completeTaskDescription.getExpression()!=null){
//			return completeTaskDescription.getExpression().getValue();
//		}
//		return null;
//	}
//	
//	/**
//	 * 获取操作表单
//	 * @param baseElement
//	 * @return
//	 */
//	public static String getFormUri(BaseElement baseElement){
//		FormUri formUri = (FormUri)BpmnModelUtil.getExtensionElement(baseElement, FoxBPMPackage.Literals.DOCUMENT_ROOT__FORM_URI);
//		if(formUri != null&&formUri.getExpression()!=null){
//			return formUri.getExpression().getValue();
//		}
//		return null;
//	}
//	
//	/**
//	 * 获取浏览表单
//	 * @param baseElement
//	 * @return
//	 */
//	public static String getFormUriView(BaseElement baseElement){
//		FormUriView formUri = (FormUriView)BpmnModelUtil.getExtensionElement(baseElement, FoxBPMPackage.Literals.DOCUMENT_ROOT__FORM_URI_VIEW);
//		if(formUri != null&&formUri.getExpression()!=null){
//			return formUri.getExpression().getValue();
//		}
//		return null;
//	}
//	
//	/**
//	 * 获取任务分配策略
//	 * @param baseElement
//	 * @return
//	 */
//	public static String getUserTaskAssigneePolicyType(BaseElement baseElement){
//		AssignPolicyType policyType = (AssignPolicyType)BpmnModelUtil.getExtensionElement(baseElement, FoxBPMPackage.Literals.DOCUMENT_ROOT__ASSIGN_POLICY_TYPE);
//		if(policyType != null){
//			return policyType.getExpression().getValue();
//		}
//		return null;
//	}
//	
//	/**
//	 * 获取任务分配策略
//	 * @param baseElement
//	 * @return
//	 */
//	public static String getUserTaskType(BaseElement baseElement){
//		String taskType = (String)BpmnModelUtil.getExtensionAttribute(baseElement, FoxBPMPackage.Literals.DOCUMENT_ROOT__TASK_TYPE);
//		return taskType;
//	}
//	
//	/**
//	 * 获取任务分配表达式
//	 * @param baseElement
//	 * @return
//	 */
//	public static String getUserTaskAssigneeExpression(BaseElement baseElement){
//		org.foxbpm.model.bpmn.foxbpm.Expression expression = (org.foxbpm.model.bpmn.foxbpm.Expression)BpmnModelUtil.getExtensionElement(baseElement, FoxBPMPackage.Literals.DOCUMENT_ROOT__ASSIGN_POLICY_TYPE);
//		return getValueFormExpression(expression);
//	}
//	
//	/**
//	 * 获取任务处理者
//	 * @param baseElement
//	 * @return
//	 */
//	public static List<TaskAssigneeDefinition> getUserTaskAssignees(BaseElement baseElement){
//		UserTask userTask = (UserTask)baseElement;
//		List<ResourceRole> resources = userTask.getResources();
//		List<TaskAssigneeDefinition> assignees = new ArrayList<TaskAssigneeDefinition>();
//		if(resources != null){
//			for(ResourceRole resource :resources){
//				if(resource != null){
//					String resourceType = StringUtil.getString(resource.eGet(FoxBPMPackage.Literals.DOCUMENT_ROOT__RESOURCE_TYPE, true));
//					boolean isContainsSub = StringUtil.getBoolean(resource.eGet(FoxBPMPackage.Literals.DOCUMENT_ROOT__IS_CONTAINS_SUB, true));
//					String resourceExpression = BpmnModelUtil.getExpression(resource.getResourceAssignmentExpression().getExpression());
//					//String resourceName = resource.getName();
//					TaskAssigneeDefinition assignee = new TaskAssigneeDefinition();
//					assignee.setContainsSub(isContainsSub);
//					assignee.setUserIdExpression(resourceExpression);
//					assignee.setGroupIdExpression(resourceExpression);
//					assignee.setGroupTypeExpression(resourceType);
//					assignees.add(assignee);
//				}
//			}
//		}
//		return assignees;
//	}
//	
//	/**
//	 * 获取任务命令集合
//	 * @param baseElement
//	 * @return
//	 */
//	public static List<TaskCommand> getUserTaskCommands(BaseElement baseElement){
//		List<TaskCommand> taskCommands = new ArrayList<TaskCommand>();
////		List<TaskCommandModel> taskCommandsObj  =BpmnModelUtil.getAll(TaskCommandModel.class, baseElement);
////		if(taskCommandsObj!=null){
////			for (TaskCommandModel tmpTaskCommand : taskCommandsObj) {
////				TaskCommand taskCommandDefinition = new TaskCommand();
////				taskCommandDefinition.setCommandType(tmpTaskCommand.getCommandType());
////				taskCommandDefinition.setId(tmpTaskCommand.getId());
////				taskCommandDefinition.setName(tmpTaskCommand.getName());
////				org.foxbpm.model.bpmn.foxbpm.Expression expression =  tmpTaskCommand.getExpression();
////				if(expression != null){
////					taskCommandDefinition.setExpression(expression.getValue());
////				}
////				expression =  tmpTaskCommand.getParameterExpression();
////				if(expression != null){
////					taskCommandDefinition.setParaExpression(expression.getValue());
////				}
////				taskCommands.add(taskCommandDefinition);
////			}
////		}
//		return taskCommands;
//	}
//	
//	/**
//	 * 获取任务优先级
//	 * @param baseElement
//	 * @return
//	 */
//	public static String getUserTaskPriority(BaseElement baseElement){
//		TaskPriority taskPriorityObj  = (TaskPriority)BpmnModelUtil.getExtensionElement(baseElement, FoxBPMPackage.Literals.DOCUMENT_ROOT__TASK_PRIORITY);
//		if(taskPriorityObj != null){
//			return taskPriorityObj.getExpression().getValue();
//		}
//		return null;
//	}
//	
//	public static String getValueFormExpression(org.foxbpm.model.bpmn.foxbpm.Expression expression){
//		if(expression != null){
//			return expression.getValue();
//		}
//		return null;
//	}
//	
//	public static Object getExtensionAttribute(BaseElement baseElement,EAttribute eAttribute){
//		return baseElement.eGet(eAttribute);
//	}
//	
//	public static Object getExtensionElement(BaseElement baseElement,EReference eReference){
//		if(baseElement==null){
//			return null;
//		}
//		if (baseElement.getExtensionValues().size() > 0) {
//			for (ExtensionAttributeValue extensionAttributeValue : baseElement.getExtensionValues()) {
//				FeatureMap extensionElements = extensionAttributeValue.getValue();
//				Object objectElement = extensionElements.get(eReference, true);
//				if (objectElement != null) {
//					if(objectElement instanceof List){
//						@SuppressWarnings("unchecked")
//						List<EObject> tObjList = (List<EObject>)objectElement;
//						if(tObjList.size()>0){
//							return tObjList.get(0);
//						}
//					}else{
//						return objectElement;
//					}
//				}
//			}
//		}
//		return null;
//	}
//	
//	@SuppressWarnings("unchecked")
//	public static <T> T getExtensionElementOne(Class<T> t ,BaseElement baseElement,EReference eReference){
//	
//		
//		if(baseElement==null){
//			return null;
//		}
//		
//		if (baseElement.getExtensionValues().size() > 0) {
//			for (ExtensionAttributeValue extensionAttributeValue : baseElement.getExtensionValues()) {
//				FeatureMap extensionElements = extensionAttributeValue.getValue();
//				
//				Object objectElement = extensionElements.get(eReference, true);
//				if (objectElement != null) {
//
//					
//					if(objectElement instanceof List){
//						List<T> tObjList = (List<T>) objectElement;
//						if(tObjList.size()>0){
//							return tObjList.get(0);
//						}
//						
//					}else{
//						return (T)objectElement;
//					}
//
//				}
//
//				
//			}
//		}
//		
//		
//		
//		
//		
//		return (T)null;
//	}
//	
//	
//	@SuppressWarnings("unchecked")
//	public static <T> List<T> getExtensionElementList( Class<T> t ,BaseElement baseElement,EReference eReference){
//		
//		
//		if (baseElement.getExtensionValues().size() > 0) {
//			for (ExtensionAttributeValue extensionAttributeValue : baseElement.getExtensionValues()) {
//				FeatureMap extensionElements = extensionAttributeValue.getValue();
//				Object objectElement = extensionElements.get(eReference, true);
//				if (objectElement != null) {
//
//					List<T> tObjList = (List<T>) objectElement;
//					return tObjList;
//				
//
//				}
//			}
//		}
//		
//		
//		return (List<T>)null;
//	}
//	
//	
//	public static String getDocumentation(BaseElement baseElement){
//		List<Documentation> documentations=baseElement.getDocumentation();
//		if(documentations.size()==0){
//			return null;
//		}
//		else{
//			String documentationText=documentations.get(0).getText();
//			return documentationText;
//		}
//	}
//	
//	/**
//	 * 增加扩展元素
//	 * @param baseElement
//	 * @param eReference
//	 * @param o
//	 * @return
//	 */
//	public static boolean addExtensionElement(BaseElement baseElement,EReference eReference,Object o){
//		final FeatureMap.Entry extensionElementEntry = new SimpleFeatureMapEntry((org.eclipse.emf.ecore.EStructuralFeature.Internal) eReference, o);
//  	  	if(baseElement.getExtensionValues().size() > 0){
//  	  		baseElement.getExtensionValues().get(0).getValue().add(extensionElementEntry);
//  	  	}else{
//  	  		ExtensionAttributeValue extensionElement = Bpmn2Factory.eINSTANCE.createExtensionAttributeValue();
//  	  		extensionElement.getValue().add(extensionElementEntry);
//  	  		baseElement.getExtensionValues().add(extensionElement);
//  	  	} 
//		return false;
//	}
//	
//	/**
//	 * 获取节点的跳过策略
//	 * 
//	 * @return
//	 */
//	public static SkipStrategy getSkipStrategy(BaseElement baseElement) {
//
//		return getExtensionElementOne(SkipStrategy.class,baseElement,FoxBPMPackage.Literals.DOCUMENT_ROOT__SKIP_STRATEGY);
//	
//	}
//	
//	/**
//	 * 增加擴展屬性
//	 * @param baseElement
//	 * @param eReference
//	 * @param o
//	 * @return
//	 */
//	public static boolean addExtensionAttribute(BaseElement baseElement,EAttribute eAttribute,Object o){
//		final FeatureMap.Entry extensionElementEntry = new SimpleFeatureMapEntry((org.eclipse.emf.ecore.EStructuralFeature.Internal) eAttribute, o);
//		baseElement.getAnyAttribute().add(extensionElementEntry);
//		return false;
//	}
//	
//	public static void setDocumentation(BaseElement baseElement,String documentationText){
//		List<Documentation> documentations=baseElement.getDocumentation();
//		if(documentations==null){
//			documentations=new ArrayList<Documentation>();
//			Documentation documentation=Bpmn2Factory.eINSTANCE.createDocumentation();
//			documentation.setText(documentationText);
//			documentations.add(documentation);
//			return;
//		}
//		if(documentations.size()==0){
//			Documentation documentation=Bpmn2Factory.eINSTANCE.createDocumentation();
//			documentation.setText(documentationText);
//			documentations.add(documentation);
//			return;
//		}
//		else{
//			documentations.get(0).setText(documentationText);
//			return;
//		}
//	}
//	
//	public static String getExpression(Expression expression){
//		if(expression==null){
//			return null;
//		}
//		return ((FormalExpression)expression).getBody();
//		
//	}
//	
//	public static Expression getExpressionByString(String expression){
//		FormalExpression formalExpression=Bpmn2Factory.eINSTANCE.createFormalExpression();
//		formalExpression.setBody(expression);
//		return formalExpression;
//		
//	}
//	
//	public static BPMNShape getBpmnShape(Definitions definitions,String elementId){
//		List<DiagramElement> diagramElements=definitions.getDiagrams().get(0).getPlane().getPlaneElement();
//		for (DiagramElement diagramElement : diagramElements) {
//			if(diagramElement instanceof BPMNShape){
//				BPMNShape bpmnShape = (BPMNShape) diagramElement;
//				BaseElement bpmnElement=getBaseElement(definitions,bpmnShape.getBpmnElement());
//				if(bpmnElement==null){
//					continue;
//				}
//				if(elementId.equals(bpmnElement.getId())){
//					return bpmnShape;
//				}
//			}
//		}
//		return null;
//	}
//	
//	public static  BaseElement getBaseElement(Definitions definitions,BaseElement baseElement){
//		if(baseElement==null){
//			return null;
//		}
//		if(baseElement.getId()==null){
//			BasicEObjectImpl basicEObjectImpl=(BasicEObjectImpl)baseElement;
//			if(basicEObjectImpl!=null&&basicEObjectImpl.eProxyURI()!=null){
//				String elementId=basicEObjectImpl.eProxyURI().fragment();
//				BaseElement bpmnElement=getBaseElement(definitions,elementId);
//				return bpmnElement;
//			}
//			else{
//				return null;
//			}
//		}else{
//			return baseElement;
//		}
//	}
//	
//	public static BPMNEdge getBpmnEdge(Definitions definitions,String elementId){
//		List<DiagramElement> diagramElements=definitions.getDiagrams().get(0).getPlane().getPlaneElement();
//		for (DiagramElement diagramElement : diagramElements) {
//			if(diagramElement instanceof BPMNEdge){
//				BPMNEdge bPMNEdge = (BPMNEdge)diagramElement;
//				String bpmnId=bPMNEdge.getBpmnElement().getId();
//				if(elementId.equals(bpmnId)){
//					return bPMNEdge;
//				}
//			}
//		}
//		return null;
//	}
//	
//	
//	public static BaseElement findElement(String id,EObject eObject) {
//		if (id == null || StringUtil.isEmpty(id))
//			return null;
//
//		List<BaseElement> baseElements = getAll(BaseElement.class,eObject);
//
//		for (BaseElement be : baseElements) {
//			if (id.equals(be.getId())) {
//				return be;
//			}
//		}
//
//		return null;
//	}
//	
//
//	@SuppressWarnings("unchecked")
//	public static <T> T findElement(String id,EObject eObject,Class<T> class1) {
//		if (id == null || StringUtil.isEmpty(id))
//			return null;
//
//		List<BaseElement> baseElements = getAll(BaseElement.class,eObject);
//
//		for (BaseElement be : baseElements) {
//			if (id.equals(be.getId())&&class1.isInstance(be)) {
//				return (T)be;
//			}
//		}
//
//		return null;
//	}
//	
//	@SuppressWarnings("unchecked")
//	public static <T> List<T> getAll(final Class<T> class1,EObject eObject) {
//		ArrayList<T> l = new ArrayList<T>();
//		TreeIterator<EObject> contents =eObject.eResource().getAllContents();
//		for (; contents.hasNext();) {
//			Object t = contents.next();
//			if (class1.isInstance(t)) {
//				l.add((T) t);
//			}
//		}
//		return l;
//	}
//	
//	public static BaseElement  getBaseElement(Definitions definitions,String elementId){
//		return findElement(elementId, definitions);
//	}
//	
//	public static <T> T  getElement(Definitions definitions,String elementId,Class<T> class1){
//		return findElement(elementId, definitions, class1);
//	}
//	
//	public static <T> List<T>  getElementList(BaseElement baseElement,Class<T> class1){
//		return getAll(class1, baseElement);
//	}
//	
//	public static Process getProcess(BaseElement baseElement){
//		return getAll(Process.class, baseElement).get(0);
//	}
//	
//	public static List<Process> getProcessList(BaseElement baseElement){
//		return getAll(Process.class, baseElement);
//	}
//
//}
